/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Grafico;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import tabla_simbolos.Tabla_Simbolos_G;

/**
 *
 * @author Cesar
 */
public class Creador {
    
    ArrayList<String> Codigo = new ArrayList();
   
    public String Iniciar_DOT(){
        return "digraph G{";
    }
    
    public String Finalizar_DOT(){
        return "}";
    }
    
    public String Iniciar_clase(int numero){
        return "subgraph cluster" + String.valueOf(numero) + "{";
    }
    
    public String Estilo_1(){
        return "node[style=filled];";
    }
    
    public String Estilo_2(){
        return "edge[arrowhead=vee];";
    }
    
    public String Estilo_3(){
        return "color=black;";
    }
    
    public String Titulo_clase(String nombre){
        return "label = \"" + nombre + "\";";
    }
    
    public String Cerrar_clase(){
        return "}";
    }
    
    public void Limpiar_codigo(){
        Codigo.clear();
    }
    
    public void Agregar_linea(String Linea){
        Codigo.add(Linea);
    }
    
    public void Crear_archivo(String carpeta){
        try{
            FileWriter Escritor = new FileWriter(carpeta + "\\Codigo.dot");
            BufferedWriter EscritorBuffer = new BufferedWriter(Escritor);
            try(PrintWriter Imprimir = new PrintWriter(EscritorBuffer)){
                for(int i=0;i<Codigo.size();i++){
                    Imprimir.println(Codigo.get(i));
                }
            }
        }catch(IOException Mensaje){
            System.out.println("Se presento el error: " + Mensaje.toString());
        }
        //Ahora hay que ver si toca limpiar el codigo.
    }
    
    public void Crear_Imagen(String carpeta){
        
        try{
            //Datos de creacion.
            String RutaDOT = "C:\\Graficos\\bin\\dot.exe";
            String Entrada = carpeta + "\\Codigo.dot";
            String Salida = carpeta + "C:\\Grafico.png";
            String Tipo = "-Tpng";
            String OParametro = "-o";
        
            String[] Comandos = new String[5];
            Comandos[0] = RutaDOT;
            Comandos[1] = Tipo;
            Comandos[2] = Entrada;
            Comandos[3] = OParametro;
            Comandos[4] = Salida;
                
            Runtime Corrida = Runtime.getRuntime();
            Corrida.exec(Comandos);
            
            System.out.println("C:\\Genero imagen");
            
        }catch(Exception E){
            System.out.println(E.getMessage());
        }
        
    }
    
    public void Ingresar_contenido(){
    
    //primero antes de crear el dibujo, tengo que investigar los valores de las variables de los atributos.
        for(int i=0;i<Tabla_Simbolos_G.Nombre_variable_atributo_grafico.size();i++){
            if(!Tabla_Simbolos_G.Nombre_variable_atributo_grafico.get(i).equals("--")){
                String variable = Tabla_Simbolos_G.Nombre_variable_atributo_grafico.get(i);
                //Voy a buscar el valor de la variable en la tabla de simbolos.
                for(int j=0;j<IDE.Home.tabla_simbolos.getNombre().size();j++){
                    //ahora si busco en la tabla, el nombre primero de la variable.
                    if(variable.equals(IDE.Home.tabla_simbolos.getNombre().get(j))){
                        //si lo encuentra, le pido su valor actual.
                        String valor = IDE.Home.tabla_simbolos.getValor().get(j);
                        //y lo cambio en el array de valores que tiene |-|-|
                        Tabla_Simbolos_G.Valor_atributo_grafico.set(i," = " + valor + ";");
                    }
                }
            }
        }
        
        //ahora tengo que investigar los valores de las variables de los metodos.
        for(int i=0;i<Tabla_Simbolos_G.Nombre_variable_metodo_grafico.size();i++){
            if(!Tabla_Simbolos_G.Nombre_variable_metodo_grafico.get(i).equals("--")){
                String variable = Tabla_Simbolos_G.Nombre_variable_metodo_grafico.get(i);
                //Voy a buscar el valor de la variable en la tabla de simbolos.
                for(int j=0;j<IDE.Home.tabla_simbolos.getNombre().size();j++){
                    //ahora si busco en la tabla, el nombre primero de la variable.
                    if(variable.equals(IDE.Home.tabla_simbolos.getNombre().get(j))){
                        //si lo encuentra, le pido su valor actual.
                        String valor = IDE.Home.tabla_simbolos.getValor().get(j);
                        //y lo cambio en el array de valores que tiene |-|-|
                        Tabla_Simbolos_G.Nombre_metodo_grafico.set(i,valor);
                    }
                }
            }
        }
        
        //ahora tengo que investigar los valores de las variables de los metodos de los parametros.
        for(int i=0;i<Tabla_Simbolos_G.Valor_metodo_parametro_grafico.size();i++){
            if(!Tabla_Simbolos_G.Valor_metodo_parametro_grafico.get(i).equals("--")){
                String variable_metodo = Tabla_Simbolos_G.Valor_metodo_parametro_grafico.get(i);
                //Voy a buscar el valor de la variable en la tabla de simbolos
                for(int j=0;j<IDE.Home.tabla_simbolos.getNombre().size();j++){
                    //ahora si busco en la tabla, el nombre primero de la variable.
                    if(variable_metodo.equals(IDE.Home.tabla_simbolos.getNombre().get(j))){
                        //si lo encuentra, le pido su valor actual.
                        String valor_metodo = IDE.Home.tabla_simbolos.getValor().get(j);
                        //y lo cambio en el array de valores que tiene |-|-|
                        Tabla_Simbolos_G.Metodo_parametro_grafico.set(i,valor_metodo);                        
                    }
                }
            }
        }
        
        //para hijo
        for(int i=0;i<Tabla_Simbolos_G.Hijo_variable_relacion.size();i++){
            if(!Tabla_Simbolos_G.Hijo_variable_relacion.get(i).equals("--")){
                String variable = Tabla_Simbolos_G.Hijo_variable_relacion.get(i);
                //Voy a buscar el valor de la variable en la tabla de simbolos
                for(int j=0;j<IDE.Home.tabla_simbolos.getNombre().size();j++){
                    //ahora si busco en la tabla, el nombre primero de la variable.
                    if(variable.equals(IDE.Home.tabla_simbolos.getNombre().get(j))){
                        //si lo encuentra, le pido su valor actual.
                        String valor = IDE.Home.tabla_simbolos.getValor().get(j);
                        //y lo cambio en el array de valores que tiene |-|-|
                        Tabla_Simbolos_G.Hijo_relacion.set(i,valor);                        
                    }
                }
            }
        }
        
        //para padre
        for(int i=0;i<Tabla_Simbolos_G.Padre_variable_relacion.size();i++){
            if(!Tabla_Simbolos_G.Padre_variable_relacion.get(i).equals("--")){
                String variable = Tabla_Simbolos_G.Padre_variable_relacion.get(i);
                //Voy a buscar el valor de la variable en la tabla de simbolos
                for(int j=0;j<IDE.Home.tabla_simbolos.getNombre().size();j++){
                    //ahora si busco en la tabla, el nombre primero de la variable.
                    if(variable.equals(IDE.Home.tabla_simbolos.getNombre().get(j))){
                        //si lo encuentra, le pido su valor actual.
                        String valor = IDE.Home.tabla_simbolos.getValor().get(j);
                        //y lo cambio en el array de valores que tiene |-|-|
                        Tabla_Simbolos_G.Padre_relacion.set(i,valor);                        
                    }
                }
            }
        }
        
        for(int i=0;i<Tabla_Simbolos_G.Nombre_tabla_temporal.size();i++){
            if(!Tabla_Simbolos_G.Nombre_tabla_temporal.get(i).equals("--")){
                String variable = Tabla_Simbolos_G.Nombre_tabla_temporal.get(i);
                //Voy a buscar el valor de la variable en la tabla de simbolos
                for(int j=0;j<IDE.Home.tabla_simbolos.getNombre().size();j++){
                    //ahora si busco en la tabla, el nombre primero de la variable.
                    if(variable.equals(IDE.Home.tabla_simbolos.getNombre().get(j))){
                        //si lo encuentra, le pido su valor actual.
                        String valor = IDE.Home.tabla_simbolos.getValor().get(j);
                        //y lo cambio en el array de valores que tiene |-|-|
                        IDE.Home.tabla_simbolos.getNombre().set(i, valor);
                    }
                }
            }
        }
        
        String Letras[] = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};

        for(int c=0;c<Tabla_Simbolos_G.Clases_css.size();c++){
            int Contador = 0;
            Tabla_Simbolos_G.Numero_relacion.add(Letras[c] + String.valueOf(Contador));
            Tabla_Simbolos_G.Numero_relacion_datos.add(Tabla_Simbolos_G.Clases_css.get(c));            
        }        
        
        for(int c=0;c<Tabla_Simbolos_G.Hijo_variable_relacion.size();c++){
            for(int d=0;d<Tabla_Simbolos_G.Numero_relacion_datos.size();d++){
                if(Tabla_Simbolos_G.Hijo_variable_relacion.get(c).equals(Tabla_Simbolos_G.Numero_relacion_datos.get(d))){
                    Tabla_Simbolos_G.Hijo_variable_relacion.set(c, Tabla_Simbolos_G.Numero_relacion.get(d));
                }
            }
        }
        
        for(int c=0;c<Tabla_Simbolos_G.Padre_variable_relacion.size();c++){
            for(int d=0;d<Tabla_Simbolos_G.Numero_relacion_datos.size();d++){
                if(Tabla_Simbolos_G.Padre_variable_relacion.get(c).equals(Tabla_Simbolos_G.Numero_relacion_datos.get(d))){
                    Tabla_Simbolos_G.Padre_variable_relacion.set(c, Tabla_Simbolos_G.Numero_relacion.get(d));
                }
            }
        }
        
        for(int c=0;c<Tabla_Simbolos_G.Clases_css.size();c++){
            String n = Tabla_Simbolos_G.Clases_css.get(c);
            String Linea = "";
            int Contador = 0;
            //Atributos
            for(int a=0;a<Tabla_Simbolos_G.Clase_atributo_grafico.size();a++){
                if(n.equals(Tabla_Simbolos_G.Clase_atributo_grafico.get(a))){
                    //Para linea
                    if(Contador == 0){
                        Linea = Letras[c] + String.valueOf(Contador);
                    }else{
                        Linea+= " -> " + Letras[c] + String.valueOf(Contador);
                    }
                    Tabla_Simbolos_G.Numero_letra.add(Letras[c] + String.valueOf(Contador));
                    Tabla_Simbolos_G.Numero_letra_datos.add(Tabla_Simbolos_G.Visibilidad_atributo_grafico.get(a)+Tabla_Simbolos_G.Estatico_atributo_grafico.get(a)+Tabla_Simbolos_G.Tipo_atributo_grafico.get(a)+Tabla_Simbolos_G.Nombre_atributo_grafico.get(a)+Tabla_Simbolos_G.Valor_atributo_grafico.get(a));
                    Contador++;
                }
            }
            //Metodos
            for(int a=0;a<Tabla_Simbolos_G.Clase_metodo_grafico.size();a++){
                if(n.equals(Tabla_Simbolos_G.Clase_metodo_grafico.get(a))){
                    //Para linea
                    if(Contador == 0){
                        Linea = Letras[c] + String.valueOf(Contador);
                    }else{
                        Linea+= " -> " + Letras[c] + String.valueOf(Contador);
                    }
                    Tabla_Simbolos_G.Numero_letra.add(Letras[c] + String.valueOf(Contador));
                    String Inicio = Tabla_Simbolos_G.Visibilidad_metodo_grafico.get(a) + Tabla_Simbolos_G.Tipo_metodo_grafico.get(a) + Tabla_Simbolos_G.Nombre_metodo_grafico.get(a);
                    Tabla_Simbolos_G.Numero_letra_datos.add(Inicio + "(" + Cargar_parametros(n,Tabla_Simbolos_G.Nombre_metodo_grafico.get(a)) + ");");
                    Contador++;
                }
            }
            Tabla_Simbolos_G.Lineas_datos.add(Linea);
        }    
        
        //Para iniciar archivo DOT
        Agregar_linea(Iniciar_DOT());
        
        for(int i=0;i<Tabla_Simbolos_G.Clases_css.size();i++){
        
        //Para crear clase con cuadrito
        Agregar_linea(Iniciar_clase(i));
        Agregar_linea(Estilo_1());
        Agregar_linea(Estilo_2());
        Agregar_linea(Estilo_3());
        //Ahora vienen las conexiones entre atributos y metodos
        Agregar_linea(Tabla_Simbolos_G.Lineas_datos.get(i));
        //El titulo que lleva la clase
        String Nombre = Tabla_Simbolos_G.Clases_css.get(i);
        String Clase = "";
        for(int j=0;j<IDE.Home.tabla_simbolos.getNombre().size();j++){
            if(Nombre.equals(IDE.Home.tabla_simbolos.getNombre().get(j))){
                Clase = IDE.Home.tabla_simbolos.getValor().get(j);
            }
        }
        Agregar_linea(Titulo_clase(Clase));
        Agregar_linea(Cerrar_clase());            
        }    
        //Separacion
        Agregar_linea("");
        //Ahora toca ingresar el contenido de los cuadritos
        for(int i=0;i<Tabla_Simbolos_G.Numero_letra.size();i++){
            Agregar_linea(Tabla_Simbolos_G.Numero_letra.get(i) + " " + "[shape=box,label=\"" + Tabla_Simbolos_G.Numero_letra_datos.get(i) + "\"];");
        }
        //Separacion
        Agregar_linea("");        
        //Ahora toca la relacion entre las clases
        for(int i=0;i<Tabla_Simbolos_G.Hijo_relacion.size();i++){
            Agregar_linea(Tabla_Simbolos_G.Hijo_variable_relacion.get(i) + " -> " + Tabla_Simbolos_G.Padre_variable_relacion.get(i) + " [label=\"" + Tabla_Simbolos_G.Mensaje_relacion.get(i) + "\"];");
        }                
        //Para finalizar archivo DOT
        Agregar_linea(Finalizar_DOT());
        
    }
    
    public String Cargar_parametros(String clase, String metodo){
        String Medio = "";
        int Contador = 0;
        for(int a=0;a<Tabla_Simbolos_G.Clase_parametro_grafico.size();a++){
            if(clase.equals(Tabla_Simbolos_G.Clase_parametro_grafico.get(a)) && metodo.equals(Tabla_Simbolos_G.Metodo_parametro_grafico.get(a))){
                if(Contador == 0){
                    Medio = Tabla_Simbolos_G.Tipo_parametro_grafico.get(a) + Tabla_Simbolos_G.Nombre_parametro_grafico.get(a);
                }else{
                    Medio+= ", " + Tabla_Simbolos_G.Tipo_parametro_grafico.get(a) + Tabla_Simbolos_G.Nombre_parametro_grafico.get(a);
                }
                Contador++;               
            }
        }
        return Medio;
    }
}
